浅析后端微服务涉及到定时任务时如何解决多集群定时任务重复执行并发的方案对比 | 您所在的位置:网站首页 › springcloud定时任务 框架 › 浅析后端微服务涉及到定时任务时如何解决多集群定时任务重复执行并发的方案对比 |
在开发的过程中,项目中使用定时器已经不是一个新鲜的事情了,但是如果你的项目后期部署到集群环境下,如果不做处理,就会出现意想不到的问题,原因:由于我们项目同时部署在多台集群机器上,因此到达指定的定时时间时,多台机器上的定时器可能会同时启动,造成重复数据或者程序异常等问题。
服务器采用了负载均衡,有两台服务器,部署的代码一样,所以里面的定时任务在某一时间会被同时执行,这就导致了很多其他意外的发生,想要解决的问题基本就三个:单点执行,故障转移,服务状态。这里对比一下网上找的几种方案: 方案一:固定执行定时任务的机器方法:在多台机器中选择一台执行定时任务,每次执行的时候回判断当前机器和指定的机器是否一致或者启动时就指定好执行机器。 优缺点:这种方法是可以有效避免多次执行的情况,但是最明显的缺点就是单点故障问题,如果你指定的机器出现了宕机,任务就不会执行了,业务逻辑就会奔溃。 有下面常见 2 种处理方案: 1、方式一:只在一台服务器上部署该定时任务代码。 优点:解决方法容易理解。缺点:部署麻烦,需要多套代码,且当这台服务器出问题时就没定时任务了。2、方式二:在定时任务代码上加上某个特定的ip限制,仅某个ip的服务器能运行该定时任务 优点:解决方法容易理解,部署简单,不需要多套代码。 缺点:同上,只能规定一台服务器运行,发送故障时就没办法了。 常见面试题:SpringCloud架构中如何保证定时任务只有一个服务在执行? 有时候我们在开发过程中,很容易犯这样一个错误,就是在服务中写一个定时任务,然后也没做其它的处理就上线了。然后微服务架构为了保证高可用,一般都会部署多个服务,这个时候问题就来了,时间一到定时任务一启动,发现你部署多少个服务,就会跑多少个定时任务。如果服务器性能一般,定时任务占用内存又多,服务器跑死都有可能。 问题:那基于SpringCloud的架构中,这种情况我们应该如何处理呢?这边我们先来简单概述一下,我们先来看一下任务执行的时序图。简单的来说,我们可以分为以下步骤: 第一步先获取当前服务ip 第二步获取springcloud集群ip信息 最后将当前ip和集群的ip进行对比,如果当前ip是集群中最小的ip则执行定时任务业务,如果不是则return掉。 通过这样的方法,就可以保证SpringCloud架构中定时任务只在一个服务在执行了,这边可能童鞋们会有一些疑问,为什么不用分布式调度框架来解决这个问题呢?当然我们也可以用分布式调度框架来解决这个问题,比如用elastic-job这个框架来就可以。但是引入第三方框架有时候会增加系统的复杂程度,学习成本也会相应的变大,最重要的是有些定时任务没必要进行分片,一个单点服务就可以搞定,就没必要耗费资源进行分片跑任务服务了。具体代码逻辑可以看这篇文章:https://blog.csdn.net/linzhiqiang0316/article/details/88047138 方案二:利用数据库的共享锁事务管理机制来运行定时任务 |
CopyRight 2018-2019 实验室设备网 版权所有 |